package com.example.disk.util;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.disk.domain.entity.File;
import com.example.disk.mapper.FileMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.convert.EntityWriter;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 功能：完成路径到id的映射
 * 完成人：李帅
 * 时间：7.18 11:44
 */
//通过路径得到文件的id，用于找到最后的父目录  /aaa/bbb   也就是找到以aaa为父目录的目录id  根目录的id设为0
@Component
public  class File_Util {
    @Autowired
    FileMapper fileMapper;
    public int getId(String path,String username){
        int rootId = fileMapper.selectOne(new QueryWrapper<File>().eq("name",username)).getId();
        if(path.length()==1){   //根目录下 也就是 /下
            return rootId;
        }else{
            //将路径进行分解
            String[] dirs = path.substring(1).split("/");       // aaa  bbb
            int len = dirs.length,const_len=dirs.length;      //目录长度，同于筛选
            //初次筛选
            List<File> files = fileMapper.selectList(
                    new QueryWrapper<File>()
                            .eq("name",dirs[--len])
            );

            //上级目录筛选
            List<File> del_file= new ArrayList<>();
            while (len!=0){       //搜索
                del_file.clear();
                //查找上一层目录对应的Id
                List<File> conditions = fileMapper.selectList(
                        new QueryWrapper<File>()
                                .eq("name",dirs[--len])
                );
                for(File file:files){
                    boolean flag=false;
                    for(File condition:conditions){
                        if(getNParentId(file,const_len-len-1)==condition.getId()){
                            flag=true;
                            break;
                        }
                    }
                    //记录需要排除的文件
                    if(!flag){
                        del_file.add(file);
                    }
                }

                //删除文件
                for(File k:del_file){
                    files.remove(k);
                }

                //判断提前退出条件
                if(files.size()==1) return files.get(0).getId();        //只剩一个了，说明找到了

            }
            //根目录筛选
            for(File file:files){
                if(file.getParent()==rootId) return file.getId();
            }
        }
        return -2;
    }


    //得到某个文件夹第n代祖宗id
    private int getNParentId(File file,int n){
        if(n==1) return file.getParent();   //返回第一代目录id

        File parent = fileMapper.selectById(file.getParent());  //第一代上级目录id
        n--;
        while(n--!=0){
            parent = fileMapper.selectById(parent.getParent());
        }
        return parent.getId();      //返回第n代祖宗id
    }


    //判断否个路径下是否有某个文件或者文件夹 flag  true:文件   false:文件夹  为文件夹时extension不起作用;
    public boolean isExist(String username,String path,String name,String extension,boolean flag){
        List<File> list;
        int parent_id = getId(path,username);
        if(flag){   //文件
            list = fileMapper.selectList(new QueryWrapper<File>().eq("parent",parent_id).eq("flag",0)
                    .eq("name",name).eq("extension",extension).eq("deleted",0));
        }else{
            list = fileMapper.selectList(new QueryWrapper<File>().eq("parent",parent_id).eq("flag",1)
                    .eq("name",name).eq("deleted",0));
        }
        if (list==null || list.size()==0)
            return false;
        return true;
    }


    //根据id得到路径
    public String getPathById(int id){
        List<String> path = new ArrayList<>();
        File file = fileMapper.selectById(id);
        if(file.getParent()<0) return  "";

        if(fileMapper.selectById(file.getParent()).getParent()<0) return "/";
        while(file.getParent()>-1){
            file = fileMapper.selectById(file.getParent());
            path.add(file.getName());
        }

        StringBuilder result = new StringBuilder();
        for(int i=path.size()-2;i>=0;i--){
            result.append("/");
            result.append(path.get(i));
        }
        return result.toString();
    }
}
